<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
	<title>boxplot 聚合 | ElasticSearch 7.7 权威指南中文版</title>
	<meta name="keywords" content="ElasticSearch 权威指南中文版, elasticsearch 7, es7, 实时数据分析，实时数据检索" />
    <meta name="description" content="ElasticSearch 权威指南中文版, elasticsearch 7, es7, 实时数据分析，实时数据检索" />
    <!-- Give IE8 a fighting chance -->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
	<link rel="stylesheet" type="text/css" href="../static/styles.css" />
	<script>
	var _link = 'search-aggregations-metrics-boxplot-aggregation.html';
    </script>
</head>
<body>
<div class="main-container">
    <section id="content">
        <div class="content-wrapper">
            <section id="guide" lang="zh_cn">
                <div class="container">
                    <div class="row">
                        <div class="col-xs-12 col-sm-8 col-md-8 guide-section">
                            <div style="color:gray; word-break: break-all; font-size:12px;">原英文版地址: <a href="https://www.elastic.co/guide/en/elasticsearch/reference/7.7/search-aggregations-metrics-boxplot-aggregation.html" rel="nofollow" target="_blank">https://www.elastic.co/guide/en/elasticsearch/reference/7.7/search-aggregations-metrics-boxplot-aggregation.html</a>, 原文档版权归 www.elastic.co 所有<br/>本地英文版地址: <a href="../en/search-aggregations-metrics-boxplot-aggregation.html" rel="nofollow" target="_blank">../en/search-aggregations-metrics-boxplot-aggregation.html</a></div>
                        <!-- start body -->
                  <div class="page_header">
<strong>重要</strong>: 此版本不会发布额外的bug修复或文档更新。最新信息请参考 <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html" rel="nofollow">当前版本文档</a>。
</div>
<div id="content">
<div class="breadcrumbs">
<span class="breadcrumb-link"><a href="index.html">Elasticsearch 权威指南 [7.7]</a></span>
»
<span class="breadcrumb-link"><a href="search-aggregations.html">聚合</a></span>
»
<span class="breadcrumb-link"><a href="search-aggregations-metrics.html">度量聚合</a></span>
»
<span class="breadcrumb-node">boxplot 聚合</span>
</div>
<div class="navheader">
<span class="prev">
<a href="search-aggregations-metrics-weight-avg-aggregation.html">« weighted_avg 聚合</a>
</span>
<span class="next">
<a href="search-aggregations-metrics-cardinality-aggregation.html">cardinality 聚合 »</a>
</span>
</div>
<div class="section xpack">
<div class="titlepage"><div><div>
<h2 class="title">
<a id="search-aggregations-metrics-boxplot-aggregation"></a>箱线图(boxplot)聚合
</h2>
</div></div></div>
<p>
<code class="literal">boxplot</code> 度量聚合，计算从聚合文档中提取的数值的箱线图。

这些值可以由给定的脚本生成，也可以从文档中的特定 numeric 或 <a class="xref" href="histogram.html" title="histogram 数据类型" rel="nofollow">histogram</a> 字段中提取。
</p>
<p>
<code class="literal">boxplot</code> 聚合返回制作<a href="https://en.wikipedia.org/wiki/Box_plot" class="ulink" target="_top">箱线图(box plot)</a>的基本信息：最小值、最大中值、第一个四分位数(第25个百分位数)和第三个四分位数(第75个百分位数)值。
</p>
<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_syntax"></a>语法
</h3>
</div></div></div>
<p>孤立的 <code class="literal">boxplot</code> 聚合如下所示：</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">{
    "boxplot": {
        "field": "load_time"
    }
}</pre>
</div>
<p>让我们来看一个表示加载时间(load time)的箱线图：</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET latency/_search
{
    "size": 0,
    "aggs" : {
        "load_time_boxplot" : {
            "boxplot" : {
                "field" : "load_time" <a id="CO180-1"></a><i class="conum" data-value="1"></i>
            }
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/329.console"></div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO180-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>字段 <code class="literal">load_time</code> 必须是 numeric 类型的。</p>
</td>
</tr>
</table>
</div>
<p>响应看起来会像下面这样：</p>
<div class="pre_wrapper lang-console-result">
<pre class="programlisting prettyprint lang-console-result">{
    ...

   "aggregations": {
      "load_time_boxplot": {
         "min": 0.0,
         "max": 990.0,
         "q1": 165.0,
         "q2": 445.0,
         "q3": 725.0
      }
   }
}</pre>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_script_3"></a>脚本(script)
</h3>
</div></div></div>
<p>
箱线图度量支持脚本。

例如，如果加载时间(load time)是以毫秒为单位的，但我们希望以秒为单位进行计算，这时我们就可以使用一个脚本来动态转换它们：
</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET latency/_search
{
    "size": 0,
    "aggs" : {
        "load_time_boxplot" : {
            "boxplot" : {
                "script" : {
                    "lang": "painless",
                    "source": "doc['load_time'].value / params.timeUnit", <a id="CO181-1"></a><i class="conum" data-value="1"></i>
                    "params" : {
                        "timeUnit" : 1000   <a id="CO181-2"></a><i class="conum" data-value="2"></i>
                    }
                }
            }
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/330.console"></div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO181-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>
参数 <code class="literal">field</code> 被替换为 <code class="literal">script</code> ，这个 script 参数使用脚本来生成计算百分点的值
</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO181-2"><i class="conum" data-value="2"></i></a></p>
</td>
<td align="left" valign="top">
<p>脚本支持参数化输入，就像任何其他脚本一样</p>
</td>
</tr>
</table>
</div>
<p>
这将把参数 <code class="literal">script</code> 解释为一个内联脚本，使用<code class="literal">painless(无痛)</code>脚本语言，没有脚本参数。

要使用一个已存储的脚本，请使用以下语法：
</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET latency/_search
{
    "size": 0,
    "aggs" : {
        "load_time_boxplot" : {
            "boxplot" : {
                "script" : {
                    "id": "my_script",
                    "params": {
                        "field": "load_time"
                    }
                }
            }
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/331.console"></div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="search-aggregations-metrics-boxplot-aggregation-approximation"></a>箱线图的值(通常)是近似值
</h3>
</div></div></div>
<p>
<code class="literal">boxplot</code> 度量使用的算法称为 TDigest (由 Ted Dunning 在<a href="https://github.com/tdunning/t-digest/blob/master/docs/t-digest-paper/histo.pdf" class="ulink" target="_top" rel="nofollow">使用T-Digests计算精确分位数中</a>引入)。
</p>
<div class="warning admon">
<div class="icon"></div>
<div class="admon_content">
<p>
箱线图与其他百分位数聚合一样，也是<a href="https://en.wikipedia.org/wiki/Nondeterministic_algorithm" class="ulink" target="_top" rel="nofollow">不确定的(non-deterministic)</a>。这意味着您可以使用相同的数据得到稍微不同的结果。

这意味着使用相同的数据会得到稍微不同的结果。
</p>
</div>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="search-aggregations-metrics-boxplot-aggregation-compression"></a>压缩(compression)
</h3>
</div></div></div>
<p>
近似算法必须平衡内存利用率和估计精度。

这种平衡可以使用参数 <code class="literal">compression</code> 来控制:
</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET latency/_search
{
    "size": 0,
    "aggs" : {
        "load_time_boxplot" : {
            "boxplot" : {
                "field" : "load_time",
                "compression" : 200 <a id="CO182-1"></a><i class="conum" data-value="1"></i>
            }
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/332.console"></div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO182-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p><code class="literal">compression</code> 控制内存使用和近似误差</p>
</td>
</tr>
</table>
</div>
<p>
TDigest算法使用多个“节点”来近似百分位数，可用的节点越多，与数据量成比例的精度(和大内存占用)就越高。

参数 <code class="literal">compression</code> 将最大节点数限制为 <code class="literal">20 * compression</code>。
</p>
<p>
因此，通过增加 <code class="literal">compression</code> 的值，可以以更多内存为代价来提高百分位数的准确性。

较大的 <code class="literal">compression</code> 值也会使算法变慢，因为底层树数据结构的大小会增加，从而导致更昂贵的操作。  

<code class="literal">compression</code> 的默认值为 <code class="literal">100</code>。
</p>
<p>
一个“节点”使用大约 32 字节的内存，因此在最坏的情况下(大量数据被排序并按顺序到达)，默认设置将产生大约 64KB 大小的 TDigest。

实际上，数据往往更加随机，TDigest 将使用更少的内存。
</p>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_missing_value_2"></a>缺失的值
</h3>
</div></div></div>
<p>
参数 <code class="literal">missing</code> 定义应该如何处理有缺失值的文档。

默认情况下，它们会被忽略，但也可以将它们视为有一个(默认)值。
</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET latency/_search
{
    "size": 0,
    "aggs" : {
        "grade_boxplot" : {
            "boxplot" : {
                "field" : "grade",
                "missing": 10 <a id="CO183-1"></a><i class="conum" data-value="1"></i>
            }
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/333.console"></div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO183-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>
<code class="literal">grade</code> 字段中没有值的文档将与值为 <code class="literal">10</code> 的文档落入同一个桶。
</p>
</td>
</tr>
</table>
</div>
</div>

</div>
<div class="navfooter">
<span class="prev">
<a href="search-aggregations-metrics-weight-avg-aggregation.html">« weighted_avg 聚合</a>
</span>
<span class="next">
<a href="search-aggregations-metrics-cardinality-aggregation.html">cardinality 聚合 »</a>
</span>
</div>
</div>

                  <!-- end body -->
                        </div>
                        <div class="col-xs-12 col-sm-4 col-md-4" id="right_col">
                        
                        </div>
                    </div>
                </div>
            </section>
        </div>
    </section>
</div>
<script src="../static/cn.js"></script>
</body>
</html>